const {
  HeartbeatReqType,
  HeartbeatResType,
  Initiative_CloseCode,
} = require("./wsConstants");

// 导入 Node.js 内置的 path 模块
const path = require("path");
// 使用 path 模块解析文件名
const fileName = path.basename(__filename);
const Name = fileName.split(".js")[0];

// 创建一个集合来存储所有连接的WebSocket实例
const clients = new Map();

module.exports = (ctx, next) => {
  console.log(`WebSocket-${Name}连接已建立 --------`);
  ctx.websocket.send(
    JSON.stringify({
      type: "Connect",
      message: `连接建立成功,开始聊天吧！`,
    })
  );

  // 将新连接的WebSocket实例添加到集合中
  // 初始化时将 websocket 实例作为键，id 为 null
  clients.set(ctx.websocket, { id: null });

  // 接收消息
  ctx.websocket.on("message", (message) => {
    console.log(`接收到消息：${message}`);

    // 解析接收到的消息
    const parsedMessage = JSON.parse(message);

    /* 处理连接打开 */
    if (parsedMessage.type == "Connect") {
      // 更新客户端的 id, 存储连接的WebSocket实例
      clients.set(ctx.websocket, { id: parsedMessage.clientId });
    }

    /* 处理心跳消息 */
    if (parsedMessage.type === HeartbeatReqType) {
      console.log("接收到心跳消息，进行响应");
      // 发送心跳响应
      ctx.websocket.send(JSON.stringify({ type: HeartbeatResType }));
    }

    /* 处理其他消息类型 */
    if (parsedMessage.type === "Message") {
      // 根据需要发送消息给特定的客户端
      sendToClient(parsedMessage);
    }
  });

  ctx.websocket.on("close", (code) => {
    console.log(code);
    if (code == Initiative_CloseCode) {
      console.log(`前端关闭了的websocket-${Name}`);
    } else {
      console.log("后端关闭");
    }
    // 从集合中移除关闭的WebSocket实例
    clients.delete(ctx.websocket);
  });
};

// 发送消息给特定的客户端
function sendToClient(parsedMessage) {
  if (!parsedMessage.target) return;
  for (const [client, info] of clients.entries()) {
    // 检查客户端的唯一标识符，如果匹配，则发送消息
    if (info.id === parsedMessage.target) {
      client.send(JSON.stringify(parsedMessage));
      return;
    }
  }
  // 如果找不到目标客户端，则记录错误或采取其他适当的操作
  console.log(`未找到目标客户端 ${parsedMessage.target}`);
}
